package com.lvhr.rpc.loadbalancer;

import com.lvhr.rpc.spi.SpiLoader;

import java.util.concurrent.ConcurrentHashMap;

/**
 * 负载均衡器工厂（工厂模式，用于获取负载均衡器对象）
 * 支持SPI动态加载 + 懒汉式单例 + 双重校验锁
 */
public class LoadBalancerFactory {

    // 单例实例缓存（Key: 负载均衡器类型, Value: 负载均衡器实例）
    private static final ConcurrentHashMap<String, LoadBalancer> INSTANCE_CACHE = new ConcurrentHashMap<>();

    // 默认负载均衡器类型
    private static final String DEFAULT_LOAD_BALANCER_TYPE = "roundRobin";

//    static {
//        // 加载所有可用的负载均衡器实现
//        SpiLoader.load(LoadBalancer.class);
//    }

    /**
     * 获取负载均衡器实例（懒加载 + 线程安全）
     *
     * @param key 负载均衡器类型
     * @return 负载均衡器实例，永不为null
     * @throws IllegalArgumentException 类型不存在时抛出
     */
    public static LoadBalancer getInstance(String key) {
        // 参数校验
        if (key == null || key.isEmpty()) {
            key = DEFAULT_LOAD_BALANCER_TYPE;
        }

        // 双重校验锁实现懒加载
        return INSTANCE_CACHE.computeIfAbsent(key, t -> {
            synchronized (LoadBalancerFactory.class) {
                // 再次检查防止其他线程已创建
                if (INSTANCE_CACHE.containsKey(t)) {
                    return INSTANCE_CACHE.get(t);
                }

                // 通过 SPI 加载实例
                LoadBalancer instance = SpiLoader.getInstance(LoadBalancer.class, t);
                if (instance == null) {
                    throw new IllegalArgumentException("Unsupported load balancer type: " + t);
                }
                return instance;
            }
        });
    }

    /**
     * 获取默认负载均衡器实例
     */
    public static LoadBalancer getDefaultInstance() {
        return getInstance(DEFAULT_LOAD_BALANCER_TYPE);
    }
}
